Tableau Desktop パフォーマンス記録機能を活用してレスポンスを最適化する
AWS事業本部コンサルティング部の石川です。Tableauでダッシュボードを作成した後、思ったより動作が遅いと感じることはありませんか?そんな時に役立つのが、Tableauのパフォーマンス記録機能です。この機能を使えば、ワークブックのどの部分に時間がかかっているのかを特定し、効果的な最適化が可能になります。
Tableauのパフォーマンス記録機能とは
パフォーマンス記録機能は、ワークブックの操作中に発生するイベントのパフォーマンス情報を記録する機能です。クエリの実行時間、レイアウト計算、レンダリング時間など、様々な指標を収集し、パフォーマンスのボトルネックを特定するのに役立ちます。
取得できる情報とその活用方法
これらの情報を分析することで、ワークブックのどの部分に最適化の余地があるかを特定し、効果的な改善策を講じることができます。
パフォーマンス記録で取得できる主な情報と、その活用方法は以下の通りです:
- データソース接続時間 (Connecting Data Source time)
- データソースへの接続に要した時間です。
- 接続に時間がかかる場合、ネットワークやデータベースサーバーの問題を調査する。
- コンパイルクエリ時間 (Compile query time)
- データソースに対して実行するクエリを生成に要した時間です。
- 複雑なフィルター計算式や条件を簡素化する
- クエリ実行時間 (Query execution time)
- クエリの実行時間です。
- 長時間かかるクエリを特定し、データソースの最適化やデータソースの見直しを行う。
- レイアウト計算時間 (Layout computation time)
- ダッシュボードやワークシートの構造を計算するプロセスを指し、ビジュアライゼーションの配置、サイズ調整、フォーマットなどの計算時間です。
- 複雑なレイアウトを簡素化する。
- レンダリング時間 (Rendering time)
- ビジュアライゼーションを画面上にレンダリングする時間です。
- 複雑なビジュアライゼーションを簡素化する。
パフォーマンス記録の手順
今回は、Tableau Desktop から クラウドDWHであるAmazon Redshiftへ接続する構成を例に解説します。なお、同じクエリをRedshiftで実行するとキャッシュされたクエリの結果返るため、今回は、データソースの設定の「初期 SQL」で、キャッシュ機能を無効化する設定を追加しています。
パフォーマンス記録するには、パフォーマンスの記録の開始した後、調査したい操作を実行、パフォーマンスの記録を終了します。パフォーマンス記録結果を含むワークブックが自動的に作成、表示されます。
[ヘルプ] - [設定とパフォーマンス] - [パフォーマンスの記録の開始] を選択します。
フィルターの適用やダッシュボードの切り替えなど、調査したい操作を実行します。Tableauは、インメモリデータベースにキャッシュしたデータを利用するように設計されているため、今回がデータをリロードします。なお、macOS環境では「command + R」、Windows環境では「Ctrl + R」でリロードできます。
[ヘルプ] - [設定とパフォーマンス] - [パフォーマンスの記録の停止] を選択します。
パフォーマンス記録結果を含むワークブックが作成、自動的に別のTableau Desktopが表示されます。デフォルトでは、Performance Summary ダッシュボードが表示されます。
Detailed Views ダッシュボードでは、タイムラインやイベント毎の処理時間を確認できます。
Redshiftに発行しているクエリの確認方法
Tableauが Redshift に発行しているクエリを確認するには、パフォーマンス記録ワークブックの「Executing Query」イベントをクリックすると、「Query」セクションに実行されたSQLクエリが表示されます。
このクエリを選択して、テキストエディタに表示すると、ダブルクオーテーションがエスケープされた文字として取得されます。
Command
"SELECT ""t0"".""catdesc"" AS ""catdesc"",
""t0"".""catgroup"" AS ""catgroup"",
""t0"".""city"" AS ""city"",
""t0"".""state"" AS ""state"",
""t0"".""username"" AS ""username"",
SUM(""listing"".""totalprice"") AS ""sum:totalprice:ok""
FROM ""public"".""listing"" ""listing""
INNER JOIN (
SELECT ""listing"".""listid"" AS ""listid (listing)"",
""category"".""catdesc"" AS ""catdesc"",
""category"".""catgroup"" AS ""catgroup"",
""users"".""city"" AS ""city"",
""users"".""state"" AS ""state"",
""users"".""username"" AS ""username""
FROM ""public"".""listing"" ""listing""
INNER JOIN ""public"".""sales"" ""sales"" ON (""listing"".""listid"" = ""sales"".""listid"")
INNER JOIN ""public"".""event"" ""event"" ON (""sales"".""eventid"" = ""event"".""eventid"")
INNER JOIN ""public"".""category"" ""category"" ON (""event"".""catid"" = ""category"".""catid"")
LEFT JOIN ""public"".""users"" ""users"" ON (""sales"".""salesid"" = ""users"".""userid"")
WHERE ((NOT (""category"".""catgroup"" IS NULL)) AND (CASE WHEN (""users"".""state"" = 'AB') THEN FALSE ELSE TRUE END))
GROUP BY 2,
3,
4,
1,
5,
6
) ""t0"" ON (""listing"".""listid"" = ""t0"".""listid (listing)"")
GROUP BY 1,
2,
3,
4,
5"
ちょっと手間がかかりますが、以下のように編集することで実行することができるSQLを取り出せます。
SELECT "t0"."catdesc" AS "catdesc",
"t0"."catgroup" AS "catgroup",
"t0"."city" AS "city",
"t0"."state" AS "state",
"t0"."username" AS "username",
SUM("listing"."totalprice") AS "sum:totalprice:ok"
FROM "public"."listing" "listing"
INNER JOIN (
SELECT "listing"."listid" AS "listid (listing)",
"category"."catdesc" AS "catdesc",
"category"."catgroup" AS "catgroup",
"users"."city" AS "city",
"users"."state" AS "state",
"users"."username" AS "username"
FROM "public"."listing" "listing"
INNER JOIN "public"."sales" "sales" ON ("listing"."listid" = "sales"."listid")
INNER JOIN "public"."event" "event" ON ("sales"."eventid" = "event"."eventid")
INNER JOIN "public"."category" "category" ON ("event"."catid" = "category"."catid")
LEFT JOIN "public"."users" "users" ON ("sales"."salesid" = "users"."userid")
WHERE ((NOT ("category"."catgroup" IS NULL)) AND (CASE WHEN ("users"."state" = 'AB') THEN FALSE ELSE TRUE END))
GROUP BY 2,
3,
4,
1,
5,
6
) "t0" ON ("listing"."listid" = "t0"."listid (listing)")
GROUP BY 1,
2,
3,
4,
5
;
応用: クエリからデータマートを作成する
パフォーマンス記録で特定した頻繁に実行される重いクエリがある場合、そのクエリ結果をデータマートとして事前に作成しておくことで、パフォーマンスを大幅に改善できる可能性があります。
- パフォーマンス記録から頻繁に実行される重いクエリを特定
- 上記の取り出したクエリからRedshiftの新しいテーブル(いわゆるデータマート)として作成(CREATE TABLE AS SELECT ...)
- データマートを用いたデータソースを作成、既存のワークブックのデータソースを置換
この方法により、複雑な計算やジョインをあらかじめ実行しておくことで、ダッシュボードの応答時間を大幅に短縮できます。
最後に
Tableauのパフォーマンス記録機能は、ダッシュボードの動作速度を改善する上でよく考え抜かれたツールです。この機能を活用することで、ワークブックのどの部分に時間がかかっているかを詳細に把握し、効果的な最適化を行うことができます。
ただし、パフォーマンスの最適化は、データ量、クエリの複雑さ、ユーザーの利用パターンなど、様々な要因を考慮しながら、継続的に改善を重ねていく必要があります。また、Redshiftとの連携を最適化する際は、Redshift側の設定も併せて検討することで、さらなるパフォーマンス向上が期待できます。
パフォーマンス記録機能を定期的に使用し、ユーザー体験を向上させるためのワークブック最適化を継続的に行うことで、より効率的で応答性の高いTableauダッシュボードを提供することができるでしょう。この機能を活用し、データ分析環境の改善に取り組むことをお勧めします。
かなり、前にはなりますが、Tableauのパフォーマンス改善のブログをまとめておりますので、ご参考にしてください。